]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
extensionUtils: Add utility for setting the current extension
authorEvan Welsh <contact@evanwelsh.com>
Tue, 5 Jul 2022 16:09:26 +0000 (12:09 -0400)
committerEvan Welsh <contact@evanwelsh.com>
Wed, 6 Jul 2022 17:40:44 +0000 (13:40 -0400)
ES modules do not allow exports to be overriden, in anticipation
of the ESM port add a `setCurrentExtension` utility which will
throw if used in the shell. This is tested using a conditional
import of Main.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2363>

js/dbusServices/extensions/extensionPrefsDialog.js
js/misc/extensionUtils.js

index 4e90da4e70d07101a684dbc8a8f8769dad8cb018..7155c1a9539a76288ce0f36b0e9f5739c00fbfea 100644 (file)
@@ -18,7 +18,7 @@ var ExtensionPrefsDialog = GObject.registerClass({
             ExtensionUtils.installImporter(extension);
 
             // give extension prefs access to their own extension object
-            ExtensionUtils.getCurrentExtension = () => extension;
+            ExtensionUtils.setCurrentExtension(extension);
 
             const prefsModule = extension.imports.prefs;
             prefsModule.init(extension.metadata);
index e49722409bb9851a7614c565013af9ac11b4aa1c..3e89a870d85fb665c39a4a07c9ced37f9b409f22 100644 (file)
@@ -2,7 +2,7 @@
 /* exported ExtensionState, ExtensionType, getCurrentExtension,
    getSettings, initTranslations, gettext, ngettext, pgettext,
    openPrefs, isOutOfDate, installImporter, serializeExtension,
-   deserializeExtension */
+   deserializeExtension, setCurrentExtension */
 
 // Common utils for the extension system and the extension
 // preferences tool
@@ -13,6 +13,19 @@ const Gettext = imports.gettext;
 
 const Config = imports.misc.config;
 
+let Main = null;
+
+try {
+    Main = imports.ui.main;
+} catch (error) {
+    // Only log the error if it is not due to the
+    // missing import.
+    if (error?.name !== 'ImportError')
+        console.error(error);
+}
+
+let _extension = null;
+
 var ExtensionType = {
     SYSTEM: 1,
     PER_USER: 2,
@@ -41,6 +54,16 @@ const SERIALIZED_PROPERTIES = [
     'canChange',
 ];
 
+/**
+ * @param {object} extension the extension object to use in utilities like `initTranslations()`
+ */
+function setCurrentExtension(extension) {
+    if (Main)
+        throw new Error('setCurrentExtension() can only be called from outside the shell');
+
+    _extension = extension;
+}
+
 /**
  * getCurrentExtension:
  *
@@ -48,6 +71,9 @@ const SERIALIZED_PROPERTIES = [
  * an extension.
  */
 function getCurrentExtension() {
+    if (_extension)
+        return _extension;
+
     let stack = new Error().stack.split('\n');
     let extensionStackLine;